﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Apresentacao.CheckIn
{
    public partial class TelaCheckIn : System.Web.UI.Page
    {
        string apartamento;
        int ID_Reserva;
        ReservaService servico_Reserva = new ReservaService();
        FluxoHospedesService servico = new FluxoHospedesService();
        ApartamentoService servico_Apartamento = new ApartamentoService();
        HospedeService servico_Hospede = new HospedeService();

        /// <summary>
        /// carregamento da página 
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Reservas)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (Request.Params["numeroApartamento"] == null || Request.Params["id"] == null)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //recupera as variaveis passadas por parâmetros
            apartamento = Request.Params["numeroApartamento"];
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);
            bool cadastrou = Convert.ToBoolean(Request.Params["cadastrou"]);

            if (cadastrou)
            {
                DesabilitarBotoes();
            }

            //Preenche os labels
            lblNumeroApartamento.Text = apartamento;

            //se o id da reserva for par, é uma reserva de hóspede particular
            if (ID_Reserva % 2 == 0)
            {
                //recupera a reserva corrente
                Reserva_Particular reserva = servico_Reserva.RecuperarDetalhesReservaParticular(ID_Reserva);

                lblCheckOut.Text = reserva.Data_Final.ToString();
                lblCheckIn.Text = reserva.Data_Inicio.ToString();

                //Preenche os labels de nomes, RGs, e CPF
                lblNomeHospede1.Text = reserva.Nome_Reserva;
                lblRGHospede1.Text = reserva.RG_Reserva;
                lblTelefone_Empresa.Text = reserva.Telefone;
                lblCPFHospede1.Text = reserva.CPF_Reserva;
                if (servico_Hospede.VerificaCadastro(lblRGHospede1.Text, 1))
                {
                    btnCompletar1.Visible = false;
                    lblCadastrado1.Visible = true;
                }


                lblNomeHospede2.Text = reserva.Nome_2;
                lblRGHospede2.Text = reserva.RG_2;
                if (servico_Hospede.VerificaCadastro(lblRGHospede2.Text, 1))
                {
                    btnCompletar2.Visible = false;
                    lblCadastrado2.Visible = true;
                }

                lblNomeHospede3.Text = reserva.Nome_3;
                lblRGHospede3.Text = reserva.RG_3;
                if (servico_Hospede.VerificaCadastro(lblRGHospede3.Text, 1))
                {
                    btnCompletar3.Visible = false;
                    lblCadastrado3.Visible = true;
                }

                lblNomeHospede4.Text = reserva.Nome_4;
                lblRGHospede4.Text = reserva.RG_4;
                if (servico_Hospede.VerificaCadastro(lblRGHospede4.Text, 1))
                {
                    btnCompletar4.Visible = false;
                    lblCadastrado4.Visible = true;
                }

                lblNomeHospede5.Text = reserva.Nome_5;
                lblRGHospede5.Text = reserva.RG_5;
                if (servico_Hospede.VerificaCadastro(lblRGHospede5.Text, 1))
                {
                    btnCompletar5.Visible = false;
                    lblCadastrado5.Visible = true;
                }




            }
            else
            {
                //recupera a reserva corrente
                Reserva_Faturada reserva = servico_Reserva.RecuperarDetalhesReservaFaturada(ID_Reserva);

                lblCheckOut.Text = reserva.Data_Final.ToString();
                lblCheckIn.Text = reserva.Data_Inicio.ToString();
                pnlCPF.Visible = false;


                //Preenche os labels de nomes, RGs, e CPF
                lblNomeHospede1.Text = reserva.Nome_1;
                lblRGHospede1.Text = reserva.RG_1;
                lblTelefone_Empresa.Text = reserva.CNPJ_Reserva;
                if (servico_Hospede.VerificaCadastro(lblRGHospede1.Text, 2))
                {
                    btnCompletar1.Visible = false;
                    lblCadastrado1.Visible = true;
                }

                lblNomeHospede2.Text = reserva.Nome_2;
                lblRGHospede2.Text = reserva.RG_2;
                if (servico_Hospede.VerificaCadastro(lblRGHospede2.Text, 2))
                {
                    btnCompletar2.Visible = false;
                    lblCadastrado2.Visible = true;
                }

                lblNomeHospede3.Text = reserva.Nome_3;
                lblRGHospede3.Text = reserva.RG_3;
                if (servico_Hospede.VerificaCadastro(lblRGHospede3.Text, 2))
                {
                    btnCompletar3.Visible = false;
                    lblCadastrado3.Visible = true;
                }

                lblNomeHospede4.Text = reserva.Nome_4;
                lblRGHospede4.Text = reserva.RG_4;
                if (servico_Hospede.VerificaCadastro(lblRGHospede4.Text, 2))
                {
                    btnCompletar4.Visible = false;
                    lblCadastrado4.Visible = true;
                }

                lblNomeHospede5.Text = reserva.Nome_5;
                lblRGHospede5.Text = reserva.RG_5;
                if (servico_Hospede.VerificaCadastro(lblRGHospede5.Text, 2))
                {
                    btnCompletar5.Visible = false;
                    lblCadastrado5.Visible = true;
                }
            }

            string dataCheckOut = lblCheckOut.Text;
            string dataCheckIn = lblCheckIn.Text;

            //Monta o objeto Fluxo_Hospede dos hospedes para calcular o preço de entrada
            Fluxo_Hospedes hospedes = new Fluxo_Hospedes()
            {
                Nome_1 = lblNomeHospede1.Text,
                RG_1 = lblRGHospede1.Text,
                Nome_2 = lblNomeHospede2.Text,
                RG_2 = lblRGHospede2.Text,
                Nome_3 = lblNomeHospede3.Text,
                RG_3 = lblRGHospede3.Text,
                Nome_4 = lblNomeHospede4.Text,
                RG_4 = lblRGHospede4.Text,
                Nome_5 = lblNomeHospede5.Text,
                RG_5 = lblRGHospede5.Text,
                Data_Reserva_Entrada = Convert.ToDateTime(dataCheckIn),
                Data_Reserva_Saida = Convert.ToDateTime(dataCheckOut),
                Data_Entrada = DateTime.Now,
                Data_Saida = Convert.ToDateTime(dataCheckOut).Date.AddDays(1),


            };

            lblPrecoEntrada.Text = "R$ " + string.Format("{0:0.00}", servico.CalcularPrecoEntrada(hospedes));


        }
        /// <summary>
        /// Evento do botão de confirmar o check-in
        /// </summary>
        protected void btnConfirmar_Click(object sender, EventArgs e)
        {

            ComumServices comum = new ComumServices();

            //recupera as variaveis passadas por parâmetros
            apartamento = Request.Params["numeroApartamento"];
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);

            string dataCheckOut = lblCheckOut.Text;
            string dataCheckIn = lblCheckIn.Text;

            if (servico.VerificarHospedeJaHotel(ID_Reserva))
            {
                //se não estiver pára a execução
                MensagemJS("ERRO: Check-In deste(s) hóspede(s) já foi efetuado!!");
                return;

            }

            //Verifica se o apartamento esta disponível
            if (!servico_Apartamento.VerificaDisponibilidade(Convert.ToInt32(apartamento)))
            {
                //se não estiver pára a execução
                MensagemJS("ERRO: Apartamento não disponível no momento!!");
                return;

            }

            //Faz validação dos telefones
            List<string> DDDs = new List<string>();
            List<string> Telefones = new List<string>();

            Telefones.Add(txtCelular.Text);
            DDDs.Add(txtDDDCelular.Text);


            if (!comum.ValidaTelefones(DDDs, Telefones))
            {
                MensagemJS("ERRO: Celular digitado não é válido");
                return;
            }

            if (String.IsNullOrEmpty(txtCelular.Text) && (ckbVenda.Checked || ckbCheckOut.Checked))
            {
                MensagemJS("ERRO: Digite o número do celular para receber os SMS especificados");
                return;
            }

            //Monta o objeto Fluxo_Hospede dos hospedes que entraram no ho
            Fluxo_Hospedes hospedes = new Fluxo_Hospedes()
            {
                ID = ID_Reserva,
                Numero_Apartamento = Convert.ToInt32(apartamento),
                Nome_1 = lblNomeHospede1.Text,
                RG_1 = lblRGHospede1.Text,
                Nome_2 = lblNomeHospede2.Text,
                RG_2 = lblRGHospede2.Text,
                Nome_3 = lblNomeHospede3.Text,
                RG_3 = lblRGHospede3.Text,
                Nome_4 = lblNomeHospede4.Text,
                RG_4 = lblRGHospede4.Text,
                Nome_5 = lblNomeHospede5.Text,
                RG_5 = lblRGHospede5.Text,
                Data_Reserva_Entrada = Convert.ToDateTime(dataCheckIn),
                Data_Reserva_Saida = Convert.ToDateTime(dataCheckOut),
                Data_Entrada = DateTime.Now,
                Data_Saida = Convert.ToDateTime(dataCheckOut).Date.AddDays(1),
                NoHotel = true,
                Celular = txtDDDCelular.Text + txtCelular.Text,
                SMSCheckOut = ckbCheckOut.Checked,
                SMSVenda = ckbVenda.Checked

            };

            //Efetua o checkIn dos hóspedes
            if (servico.EfetuarCheckIn(hospedes))
            {
                MensagemJS("Check-In efetuado com sucesso!");
                DesabilitarBotoes();
            }
            else
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Check-In deste(s) hóspede(s) já foi efetuado!!");
                return;
            }

        }

        //Desabilita os botões de SMS
        private void DesabilitarBotoes()
        {
            txtCelular.Enabled = false;
            txtDDDCelular.Enabled = false;
            ckbCheckOut.Enabled = false;
            ckbVenda.Enabled = false;

        }

        /// <summary>
        /// Evento de click para o botao completar cadastro
        /// </summary>
        protected void btnCompletar1_Click(object sender, EventArgs e)
        {
            //recupera as variaveis passadas por parâmetros
            apartamento = Request.Params["numeroApartamento"];
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);
            int numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);

            //se o id da reserva for par, é uma reserva de hóspede particular
            if (ID_Reserva % 2 == 0)
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede1.Text + "&RGHospede=" + lblRGHospede1.Text + "&CPFHospede=" + lblCPFHospede1.Text + "&TelefoneHospede=" + lblTelefone_Empresa.Text + "&faturado=false&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
            else
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede1.Text + "&RGHospede=" + lblRGHospede1.Text + "&Empresa=" + lblTelefone_Empresa.Text + "&faturado=true&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);

            if (ID_Reserva % 2 == 0)
            {
                //Redireciona para a pagina anterior
                Response.Redirect("~/Apresentacao/Reservas/ListarReservasParticulares.aspx");
            }
            else
            {
                //Redireciona para a pagina anterior
                Response.Redirect("~/Apresentacao/Reservas/ListarReservasFaturadas.aspx");
            }



        }

        /// <summary>
        /// Evento de click para o botao completar cadastro
        /// </summary>
        protected void btnCompletar2_Click(object sender, EventArgs e)
        {
            //recupera as variaveis passadas por parâmetros
            apartamento = Request.Params["numeroApartamento"];
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);
            int numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);

            //se o id da reserva for par, é uma reserva de hóspede particular
            if (ID_Reserva % 2 == 0)
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede2.Text + "&RGHospede=" + lblRGHospede2.Text + "&faturado=false&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
            else
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede2.Text + "&RGHospede=" + lblRGHospede2.Text + "&Empresa=" + lblTelefone_Empresa.Text + "&faturado=true&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
        }

        /// <summary>
        /// Evento de click para o botao completar cadastro
        /// </summary>
        protected void btnCompletar3_Click(object sender, EventArgs e)
        {
            //recupera as variaveis passadas por parâmetros
            apartamento = Request.Params["numeroApartamento"];
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);
            int numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);

            //se o id da reserva for par, é uma reserva de hóspede particular
            if (ID_Reserva % 2 == 0)
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede3.Text + "&RGHospede=" + lblRGHospede3.Text + "&faturado=false&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
            else
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede3.Text + "&RGHospede=" + lblRGHospede3.Text + "&Empresa=" + lblTelefone_Empresa.Text + "&faturado=true&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
        }

        /// <summary>
        /// Evento de click para o botao completar cadastro
        /// </summary>
        protected void btnCompletar4_Click(object sender, EventArgs e)
        {
            //recupera as variaveis passadas por parâmetros
            apartamento = Request.Params["numeroApartamento"];
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);
            int numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);

            //se o id da reserva for par, é uma reserva de hóspede particular
            if (ID_Reserva % 2 == 0)
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede4.Text + "&RGHospede=" + lblRGHospede4.Text + "&faturado=false&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
            else
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede4.Text + "&RGHospede=" + lblRGHospede4.Text + "&Empresa=" + lblTelefone_Empresa.Text + "&faturado=true&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
        }

        /// <summary>
        /// Evento de click para o botao completar cadastro
        /// </summary>
        protected void btnCompletar5_Click(object sender, EventArgs e)
        {
            //recupera as variaveis passadas por parâmetros
            apartamento = Request.Params["numeroApartamento"];
            ID_Reserva = Convert.ToInt32(Request.Params["id"]);
            int numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);

            //se o id da reserva for par, é uma reserva de hóspede particular
            if (ID_Reserva % 2 == 0)
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede5.Text + "&RGHospede=" + lblRGHospede5.Text + "&faturado=false&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
            else
            {
                //Redireciona para a pagina de cadastro de hospedes
                Response.Redirect("~/Apresentacao/Hospedes/CadastrarHospede.aspx?NomeHospede=" + lblNomeHospede5.Text + "&RGHospede=" + lblRGHospede5.Text + "&Empresa=" + lblTelefone_Empresa.Text + "&faturado=true&CheckIn=true&apartamento=" + apartamento + "&id=" + ID_Reserva + "&numeroHospedes=" + numeroHospedes);
            }
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "Mensagem",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }


    }
}